package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"strconv"
	"strings"
)

// 不要对迭代参数取地址（都是指向的一个地址）
// 转二进制
func convertToBin(n int) string {
	result := ""
	for ; n > 0; n /= 2 { //省略局部变量初始条件，参数中已定义
		lsb := n % 2
		result = strconv.Itoa(lsb) + result //转数字字符
	}
	return result
}

// 读文件
func printFile(filename string) {
	file, err := os.Open(filename) //file类比文件流
	if err != nil {
		panic(err) //panic抛异常，中断执行，相当于throw
	}

	printFileContents(file)
}

// 打印文件内容
func printFileContents(reader io.Reader) {
	scanner := bufio.NewScanner(reader) //使用bufio来读写文件，效率高，相当于stream读写器,先把数据加载到缓存
	//通过读写器获取下一个元素,实现方法Reader接口
	//scanner.Scan()会每次调用Read方法，File默认实现Read方法按行读取，即获取文件下一行内容
	for scanner.Scan() { //省略递增条件，相当于while
		fmt.Println(scanner.Text())
	}
}

func forever() {
	for { //死循环，相当于whlie(true)
		fmt.Println("abc")
	}
}

func main() {
	fmt.Println("convertToBin results:")
	fmt.Println(
		convertToBin(5),  // 101
		convertToBin(13), // 1101
		convertToBin(72387885),
		convertToBin(0),
	)

	fmt.Println("abc.txt contents:")
	printFile("basic/branch/abc.txt")

	fmt.Println("printing a string:")
	s := `abc"d"
	kkkk
	123

	p` //``可以跨行的字符串，类比@""
	printFileContents(strings.NewReader(s))

	// Uncomment to see it runs forever
	forever()
}
